package day11;

import java.util.Objects;

/*本类用于测试顶级父类Object*/
//总结:
//1.如果想要查看对象的属性值,需要重写toString()
//  否则使用的就是Object的默认实现,打印的是对象的地址值
//2.如果要判断两个对象间的所有属性值相同,比较结果为true,就需要重写equals()
//  否则使用的就是Object的默认实现,通过==比较的是两个对象的地址值,不是属性
public class TestObject {
    public static void main(String[] args) {
        //4.创建对象进行测试
        Student s = new Student("海绵宝宝",3);
        Student s2 = new Student("海绵宝宝",3);
        /*测试toString():返回的是该对象的字符串表示*/
        /*查看源码的方式:按住Ctrl键,移到目标位置,鼠标点击即可*/
        //5.打印s对象
        //5.1测试1打印的是cn.tedu.api.Student@1b6d3586,是地址值,因为Object默认实现:
        //return getClass().getName() + "@" + Integer.toHexString(hashCode());
        //5.2测试2打印的是Student{name='海绵宝宝', age=3},是重写toString()以后的结果
        System.out.println(s);
        /*测试hashcode()*/
        //6.测试hashCode()
        System.out.println(s.hashCode());//460141958
        //7.测试equals()
        //7.1第一次测试执行结果是false
        //底层:用了==进行对象间的比较,==比较的是两个对象的地址值,s和s2是两个对象,地址值不同
        //public boolean equals(Object obj) { return (this == obj);}
        //需求:比较s与s2对象,如果属性值相同,就认为是同一个对象,并让equals()返回true
        //7.2第二次测试执行结果是true
        System.out.println(s.equals(s2));
    }
}
//1.创建学生类
class Student{

    //2.定义属性
    String name;//姓名
    int age;//年龄
    //3.生成构造方法
    /*右键-Generate-Constructor-按住Shift可以全选属性*/
    //3.1定义无参构造
    public Student() { }
    //3.2定义全参构造
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //6.添加重写的toString()
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

}







